"""

冒泡排序是一种简单且经典的排序算法。它的基本思想是通过多次遍历数组，将较大的元素逐渐移动到数组的末尾，就像气泡在水中上升一样。以下是冒泡排序的详细步骤：

1. **第一趟冒泡**：对前 \( n \) 个元素执行冒泡，使第一个最大值元素放置在正确位置上。
   - 比较第 1 个元素和第 2 个元素，如果前者大于后者，则交换位置，否则不交换。
   - 然后比较第 2 个元素和第 3 个元素，依此类推，直到比较第 \( n-1 \) 个元素和第 \( n \) 个元素。
   - 经过第一趟排序，最大的元素被安置在第 \( n \) 个位置上。

2. **第二趟冒泡**：对前 \( n-1 \) 个元素执行冒泡，使第二个最大值元素放置在正确位置上。
   - 重复上述比较和交换过程，但这次只对前 \( n-1 \) 个元素进行操作。
   - 经过第二趟排序，第二大的元素被安置在第 \( n-1 \) 个位置上。

3. **依次类推**：重复上述冒泡过程，每次减少一个元素的比较，直到某一趟排序过程中不出现元素交换位置的动作，则排序结束。

这种方法的时间复杂度为 \( O(n^2) \)，适用于小规模数据的排序¹²。

"""
num = [5, 2, 3, 6, 1, 12, 4]


def bubble_sort(nums: [int]) -> [int]:
    for n in range(len(num) - 1):

        flag = False  # ==> "标记优化"或"提前退出优化"

        for i in range(len(num) - n - 1):
            # 先将序列中第  1 个元素与第 2 个元素进行比较，如果前者大于后者，则两者交换位置，否则不交换
            if num[i] > num[i + 1]:
                # 两者交换位置，否则不交换
                num[i], num[i + 1] = num[i + 1], num[i]
                flag = True
        if not flag:
            break


if __name__ == '__main__':
    bubble_sort(num)
    print(num)

